FT232Hの方が最強かもしれない(1) – シリアル、SPI通信編

您所在的位置:网站首页 ft2232d mpsse FT232Hの方が最強かもしれない(1) – シリアル、SPI通信編

FT232Hの方が最強かもしれない(1) – シリアル、SPI通信編

#FT232Hの方が最強かもしれない(1) – シリアル、SPI通信編| 来源: 网络整理| 查看: 265

SNSへはこちら

ツイート このエントリーをはてなブックマークに追加 0 FT232Hの方が最強かもしれない(1) - シリアル、SPI通信編

2018/3/30 コンピューター, 電子工作 0

最近これと言って個人的に熱いネタもなく、秋月でぶらりしていた時になんとなく FT232HL を購入しました。このモジュールの特徴である MPSSE を使って SPI 通信をやってみましたので、ご紹介します。

浮気

この前確かこの記事とこの記事に堂々と FT232RL は最強だ!という記事を書きましたね。あれは嘘だ((

実は前々から気になっていたので買ってしまいました。ややお高めで 1,200円。以下が商品ページのリンクです。

FT232HL ハイスピードUSBシリアル変換モジュール: 半導体(モジュール) 秋月電子通商-電子部品・ネット通販電子部品,通販,販売,半導体,IC,マイコン,電子工作FT232HL ハイスピードUSBシリアル変換モジュール秋月電子通商 電子部品通信販売akizukidenshi.com

このモジュール、何が良いかというと、MPSSE によって高速なシリアル通信が出来るということですね。この MPSSE は高速なだけでなく、SPI や I2C、はたまた JTAG なんかもサポートしているのでアドがデカイです。つまり適切な MPSSE コマンドを叩くだけで、例えば SPI でしたらクロックに合わせてデータ送出等をやってくれるというわけです。いいね。ただ、I2C は手続きを書かなきゃいけないのでつらそうですが。 なのでこのモジュールに浮気をしてみることにします。

電源周り

こちらは FT2232D にあった、3.3V の供給がないと言う問題は発生しません。基板上にジャンパが2つあるのですが、内1つをショートさせると(どちらかは説明書をご覧ください)信号及び Vcc が 3.3V になります。逆にオープンにすると IC の方に電圧が入力されませんので、5V 端子からジャンパケーブル等で VIO に入れてやる、と言った方法を取ります。 どうやら VIO は 3.3V 限定のようです。出力される電圧レベルは常に 3.3V。5V トレラントなのですが、出力を 5V レベルにしたい場合は別途レベル変換回路に通す必要がありそう。むむ。

使ってて気づいたんですが、ちょっと IC が熱を持つのが気になります。消費電力大きいんですかねぇ。通常のシリアル通信でも温度は変わらないみたいなんですが、そこら辺どうなんでしょう。

UART やってみる

それではまず普通の仮想 COM ポートとしての通信です。とはいっても何もせずとも TXD を RXD を繋いでやるだけで OK です。僕は TXD(ADBUS0) と RXD(ADBUS1) をショートさせてループバックしてみたんですが、普通に動作しています。説明書によると、その他 RTS# や RI# 等もあるので、FT232R の代わりにもなりますね。

MPSSE の始め方

こちらの機能は BitBang モードで利用可能なものです。ですので libftd2xx を用いるということになります。僕は C言語で記述しました。 こちらのためのアプリケーションノートはここ(AN108)とかここ(AN180)で見つかりました。なおこの英語は節区切りのカンマがない British な英語なので丁寧に読んで下さいね。僕は British English 好きですよ。

どうやら MPSSE モードになった場合、通常の FT_Write がそのままコマンド発行関数になるということらしいです。例えばデータを送るコマンドを引数とともに発行すると、MPSSE さんが解釈して操作を行ってくれるらしいです。

実際に FT232HL デバイスを初期化する方法ですが、こんな記載があります。

ですので D2XX ライブラリの関数をひとまず以下のように呼び出しました。#include はしといてくださいね。

if( FT_Open(0, &ft) != FT_OK ) { fprintf(stderr, "Error\n"); return 1; } FT_SetBitMode(ft, 0x00, FT_BITMODE_RESET); FT_SetBitMode(ft, (UCHAR)0xFF, FT_BITMODE_MPSSE); // MPSSE, all output FT_SetLatencyTimer(ft, 16); FT_SetTimeouts(ft, 1000, 1000);

これでデバイスは MPSSE モードに入りました。これ以降 FT_Write および FT_Read でコマンド発行、読み出しができます。

今回は FT_Write の方を使いますが、いちいち引数指定が面倒だったので、自作関数を作りました。

FT_STATUS write_mpsse(int num, ...) { FT_STATUS ret; va_list args; UCHAR outBuffer[10]; ULONG written; va_start(args, num); for(int i=0; i> 8), dat & 0xFF); write_mpsse(1, 0x87); // set values immediately write_mpsse(3, 0x80, 0x08, 0x0B); // set pin direction SK, DO, CS for output dat += 128; if( dat >= 0x1000 ) { dat = 0; } }

これでできます。コンパイル時には -lftd2xx をお忘れなく。実際の動作の様子は写真をご覧ください。

本記事で使ったコードです。

コマンド発行手順や flush のタイミング等癖がありましたが(慣れてないだけ?)、一度やり方が分かってしまえばさくっと SPI 通信できちゃいましたね。驚きです。 近いうちにavrNerdをこの MPSSE 用にスッキリと書き直してみたいとは思います。

I2C は面倒くさそうなのでパスしたいお気持ちです。気が向いたらやるということで。(え?気が向かないまま「その1」で終わっている記事が多い?知りませんねぇ) というわけで JTAG の調査をしたいと思います。OpenOCD で使えたらいいなぁ。

Ad Ad

SNSへはこちら

ツイート このエントリーをはてなブックマークに追加 0

RSS等はこちら



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3